// 使用BepuUtilities;
// 使用BepuUtility：Memory;
// 使用BepuPhysics.Constraints;
// 使用制度;
// 使用System.Collections.Generic;
// 使用System.Diagnostics;
// 使用System.Text;
// 使用System.Threading;

// 命名空间BepuPhysical
// {
// 公共分部类求解器
// {

// PUBLIC BUFFER<int>StageIndices;//中间调度程序使用。
// void IntermediateWork(Int WorkerIndex)
// {
// int syncStage=0;
// int block Index;
// var endIndex=context.WorkBlocks.Count;
// var inverseDt=1f/context.Dt;
// ref var activeSet=ref ActiveSet;
// WHILE(block Index=Interlocked.Increment(参考阶段索引[syncStage])<=endIndex)
// {
// ref var挡路=ref context.WorkBlock[块索引-1];
// 参考变量类型批次=参考activeSet.Batches[block.BatchIndex].TypeBatches[block.TypeBatchIndex];
// TypeProcessors[typeBatch.TypeId].Prestep(Ref typeBatch,Body,context.Dt,inverseDt,block.StartBundle,block.End);
// }

// InterstageSync(参考syncStage);

// for(int batchIndex=0;batchIndex<activeSet.Batches.Count;++batchIndex)
// {
// endIndex=context.BatchBoraries[batchIndex];
// WHILE(block Index=Interlocked.Increment(参考阶段索引[syncStage])<=endIndex)
// {
// ref var挡路=ref context.WorkBlock[块索引-1];
// 参考变量类型批次=参考activeSet.Batches[block.BatchIndex].TypeBatches[block.TypeBatchIndex];
// TypeProcessors[typeBatch.TypeId].WarmStart(ref类型Batch,Ref Bodies.ActiveSet.Veloities,block.StartBundle,block.End);
// }
// InterstageSync(参考syncStage);
// }

// for(int iterationIndex=0;iterationIndex<iterationCount;++iterationIndex)
// {
// for(int batchIndex=0;batchIndex<activeSet.Batches.Count;++batchIndex)
// {
// endIndex=context.BatchBoraries[batchIndex];
// WHILE(block Index=Interlocked.Increment(参考阶段索引[syncStage])<=endIndex)
// {
// ref var挡路=ref context.WorkBlock[块索引-1];
// 参考变量类型批次=参考activeSet.Batches[block.BatchIndex].TypeBatches[block.TypeBatchIndex];
// TypeProcessors[typeBatch.TypeId].SolveIteration(ref类型Batch,Ref Bodies.ActiveSet.Veloities,block.StartBundle,block.End);
// }
// InterstageSync(参考syncStage);
// }
// }
// }





// Public Double IntermediateMultithreadedUpdate(IThreadDispatcher线程池、BufferPool BufferPool、Float Dt、Float InverseDt)
// {
// var workerCount=context.WorkerCount=threadPool.ThreadCount;
// context.WorkerCompletedCount=0;
// context.dt=dt;
// //首先构建一组工作块。
// //挡路的大小应该比较小,让偷工者有事可做,但是我们也不想因为块数太多而发疯。
// //这些值是通过经验调整得出的。最佳值可能因体系结构而异。
// //这里的目标是刚好有足够的块,以便在我们最终出现一些动力不足的线程(由于竞争或超线程)的情况下,
// //有足够的块,工作窃取通常仍然允许额外的线程有用。
// const int targetBlocksPerBatchPerWorker=16;
// const int Minimum BlockSizeInBunles=4;

// var maxumBlocksPerBatch=workerCount*targetBlocksPerBatchPerWorker;
// BuildWorkBlock(BufferPool,minimumBlockSizeInBunles,maxumBlocksPerBatch);
// ValidateWorkBlock();

// ref var activeSet=ref ActiveSet;
// var stageCount=1+activeSet.Batches.Count*(iterationCount+1);
// bufferPool.SpecializeFor<int>().Take(stageCount,Out StageIndices);

// StageIndices[0]=0;
// int stageIndex=1;
// for(int i=0;i<iterationCount+1;++i)
// {
// for(int batchIndex=0;batchIndex<activeSet.Batches.Count;++batchIndex)
// {
// StageIndices[stageIndex++]=batchIndex>0？context.BatchBoraries[batchIndex-1]：0;
// }
// }

// var start=Stopwatch.GetTimestamp();
// threadPool.DispatchWorkers(IntermediateWork);
// var end=Stopwatch.GetTimestamp();

// BufferPool.SpecializeFor<int>().Return(Ref StageIndices);
// context.WorkBlocks.Dispose(bufferPool.SpecializeFor<WorkBlock>());
// context.BatchBoundaries.Dispose(bufferPool.SpecializeFor<int>());
// 返回(结束-开始)/(双倍)秒表。频率;
// }



// }
// }
